//
// Created by pzw on 24-3-25.
//

#ifndef QTTEST_SMARTPTR_H
#define QTTEST_SMARTPTR_H

#include <memory>
#include <iostream>
#include <algorithm>
#include <iterator>

class SmartPtr {
public:/* 单例模式的智能指针 */
    template<typename Tp, typename... Args>
    static std::unique_ptr<Tp> std_make_unique(Args &&... args);
    template<typename Tp, typename... Args>
    static std::unique_ptr<Tp> std_constructor_unique(Args &&... args);

public:/* 共享智能指针 */
    template<typename Tp, typename... Args>
    static std::shared_ptr<Tp> std_make_shared(Args &&... args);
    template<typename Tp, typename... Args>
    static std::shared_ptr<Tp> std_constructor_shared(Args &&... args);

public:/* weak_ptr智能指针，依附于shared_ptr，很特殊，所以注意我封装时，返回值并不是std::weak_ptr
        * 而是std::shared_ptr*/
    template<typename Tp, typename... Args>
    static std::shared_ptr<Tp> std_make_weak(Args &&... args);
    template<typename Tp, typename... Args>
    static std::shared_ptr<Tp> std_constructor_weak(Args &&... args);
};


int SmartPtr_main();

#endif //QTTEST_SMARTPTR_H
